#include "Thread.h"
#include <iostream>
#include <utility>

// 初始化
__thread const char* name = "current_thread";

Thread::Thread( ThreadCallback&& cb, const string& name )
: _thid(0)
, _cb(std::move(cb))
, _name(name)
, _isRunning( false )
{

}

Thread::~Thread()
{
    if (_isRunning) {
        // 让子线程与主线程分离，子线程自己回收自己的资源
        pthread_detach(_thid);
    }
}

void Thread::start()
{
    // threadFunc 设置成静态成员函数
    // pthread_create 第三个参数是一个函数指针，该指针的类型已经被严格固定
    // 如果 threadFunc 函数设计成成员函数，会多一个 this 指针，所以设置成静态的
    // this 指针由第四个参数，传给线程入口函数 threadFunc
    int ret = pthread_create(&_thid, nullptr, threadFunc, this);
    if (ret) {
        perror("pthread_create error.");
        return;
    }
    _isRunning = true;
}

void Thread::join()
{
    if (_isRunning) { // 线程在运行
        int ret = pthread_join(_thid, nullptr);
        if (ret) {
            perror("pthread_join error.");
            return;
        }
        _isRunning = false;
    }
}
void* Thread::threadFunc( void* arg )
{
    Thread* pth = static_cast<Thread*>(arg);

    if (pth) // 指针判空
    {
        name = pth->_name.c_str();
        pth->_cb(); // 执行回调函数
    }

    pthread_exit(nullptr);  // 线程退出
}
